package com.atguigu.config;

import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.condition.MyImportBeanDefinitionRegistrar;
import com.atguigu.condition.MyImportSelector;
import com.atguigu.condition.WindowsCondition;
import org.springframework.context.annotation.*;

/**
 * @author : zjj
 * @date : 2021/9/23 11:33
 */

@Configuration
/**
 * 直接导入 要导入的类
 * 导入一个  ImportSelector
 * 导入一个  ImportBeanDefinitionRegistrar
 */
@Import({Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfiguration2 {

    /**
     *
     * @Scope:调整作用域
     * prototype：多实例的：ioc容器启动并不会去调用方法创建对象放在容器中。
     * 					每次获取的时候才会调用方法创建对象；
     * singleton：单实例的（默认值）：ioc容器启动会调用方法创建对象放到ioc容器中。
     * 			以后每次获取就是直接从容器（map.get()）中拿，
     * request：同一次请求创建一个实例
     * session：同一个session创建一个实例
     *
     * 懒加载：
     * 		单实例bean：默认在容器启动的时候创建对象；
     * 		懒加载：容器启动不创建对象。第一次使用(获取)Bean创建对象，并初始化；
     **/
    @Scope(value = "singleton")
    @Bean
    @Lazy
    public Person person(){
        System.out.println("给容器中添加一个person 。。。。 ");
        return new Person();
    }

    /**
     * 满足是linux  condition才会注入到容器中去
     * @return  person
     */
    @Bean("linus")
    @Conditional(LinuxCondition.class)
    public Person person02(){
        return new Person();
    }

    @Bean("bill")
    @Conditional(WindowsCondition.class)
    public Person person03(){
        return new Person();
    }

    /**
     * 这里给容器中注入的是  ： ColoFactoryBean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }

}
